package com.dc.docs._888_面试.concurrent._9_synchronized;

/**
 * Description: Synchronized 修饰静态方法（锁的是class对象）
 * @author: gdc
 * @date: 2021/6/17
 * @version 1.0
 */
public class SyncClassDemo implements Runnable{
    /**
     * 资源
     */
    private static int num = 0;

    /**
     * synchronized 作用于静态方法，锁的是当前class对象
     */
    public static synchronized void increase(){
        num++;
    }

    /**
     * synchronized 作用于实例方法，锁的是当前的实例对象
     * 如果多个线程服务的对象不同，在同时调用该方法，将不会产生互斥现象，因为锁的对象不同。
     */
    public synchronized void increase4Obj(){
        num++;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            increase();

            //increase4Obj();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SyncClassDemo obj1 = new SyncClassDemo();
        SyncClassDemo obj2 = new SyncClassDemo();

        /**
         * 两个线程操作两个不同的实例
         *
         * 由于 synchronized 修饰的是静态方法，锁的是当前的class对象。
         * 因此即使操作不同的对象实例，返回的结果依然正确
         */
        Thread thread1 = new Thread(obj1);
        Thread thread2 = new Thread(obj2);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println(num);
    }
}
